/*
 * AC
 * DP
 * 01 knapsack problem
 **/
#include <stdio.h>

#define max(a, b) ((a) > (b) ? (a) : (b))

int f[12881];
int list[3402][2];
int n, m;
/*int knapsack_max(int i, int v);*/
int main(int argc, char **argv)
{
	int i, v, maxx = 0;
	scanf("%d %d", &n, &m);
	for (i = 0; i < n; i++) {
		scanf("%d %d", &list[i][0], &list[i][1]);
	}
	for (i = 0; i < n; i++)
		for (v = m; v >= list[i][0]; v--) {
			f[v] = max(f[v], f[v - list[i][0]] + list[i][1]);
			if (maxx < f[v])
				maxx = f[v];
		}
	printf("%d\n", maxx);
	return 0;
}

/*
int knapsack_max(int i, int v)
{
	if (i == 0) {
		if (v > list[i][0])
			f[i][v] = list[i][1];
		else
			f[i][v] = 0;
		printf("i=%d,v=%d %d\n", i, v, f[i][v]);
		return f[i][v];
	}
	if ((v - list[i][0]) > 0) {
		if (f[i - 1][v] && f[i - 1][v - list[i][0]]) {
			f[i][v] = max(f[i - 1][v], f[i - 1][v - list[i][0]] + list[i][1]);
		}
		else if (f[i - 1][v])
			f[i][v] = max(f[i - 1][v], knapsack_max(i - 1, v - list[i][0]) + list[i][1]);
		else if (f[i - 1][v - list[i][0]])
			f[i][v] = max(knapsack_max(i - 1, v), f[i - 1][v - list[i][0]] + list[i][1]);
		else 
			f[i][v] = max(knapsack_max(i - 1, v), knapsack_max(i - 1, v - list[i][0]) + list[i][1]);
	}
	else f[i][v] = f[i - 1][v] != 0? f[i - 1][v] : knapsack_max(i - 1, v);
	printf("i=%d,v=%d %d\n", i, v, f[i][v]);
	return f[i][v];
}
*/
